home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 52 / Amiga Format AFCD52 (Issue 136, May 2000).iso / -serious- / hardware / ahd12 / ahd / hdif.s < prev    next >
Text File  |  2000-02-28  |  13KB  |  523 lines

  1.         include "exec/types.i"
  2.         include "exec/devices.i"
  3.         include "exec/io.i"
  4.         include "exec/initializers.i"
  5.         include "exec/resident.i"
  6.         include "exec/errors.i"
  7.  
  8.         include "messages.i"
  9.  
  10.         XDEF    Read
  11.         XDEF    Write
  12.         XDEF    FormatTrk
  13.         XDEF    doreset
  14.         XDEF    doinit
  15.         XDEF    doerror
  16.         XDEF    readsec
  17.         XDEF    writesec
  18.         XDEF    dofmttrk
  19.         XDEF    doseek
  20.         XDEF    hdconfig
  21.         XDEF    _inbuffer
  22.  
  23.         XREF    _CXD33
  24.         XREF    subSysName
  25.  
  26. MAXBLK          equ     $20000
  27.  
  28.         section "hdifcode",code
  29.  
  30. FormatTrk
  31.         move.l  a1,a3
  32.         bsr     doinit
  33.         bne.s   FormatTrk
  34.         move.l  IO_OFFSET(a3),d0
  35.         bsr     dofmttrk
  36.         bne.s   fmterr
  37.         move.l  IO_DATA(a3),a2
  38.         move.l  IO_OFFSET(a3),d0         ;d5 = IO_OFFSET
  39.         move.l  IO_LENGTH(a3),d1
  40.         beq.s   fmtend
  41.         bsr     writesec
  42.         bne     fmterr
  43. fmtend  move.l  IO_LENGTH(a3),IO_ACTUAL(a3)
  44.         clr.b   IO_ERROR(a3)         ;IO_ERROR = 0
  45.         rts
  46.  
  47. fmterr  clr.l   IO_ACTUAL(a3)         ;IO_ACTUAL = 0
  48.         move.b  #$17,IO_ERROR(a3)    ;IO_ERROR = TDERR_SeekError
  49.         rts
  50.  
  51. Write
  52.         move.l  a1,a3
  53.         move.l  IO_DATA(a3),a2
  54.         move.l  IO_OFFSET(a3),d4
  55.         move.l  IO_LENGTH(a3),d5
  56.         beq     wrtend
  57. wnxblk  cmp.l   #MAXBLK,d5
  58.         bhi     wrbig
  59.         move.l  d4,d0
  60.         move.l  d5,d1
  61.         bsr     remap
  62.         bsr     writesec
  63.         bne     writeerr
  64.         beq     wrtend
  65. wrbig   move.l  #MAXBLK,d1
  66. wrb1    move.l  d4,d0
  67.         bsr     remap
  68.         bsr     writesec
  69.         bne     writeerr
  70.         add.l   #MAXBLK,a2
  71.         add.l   #MAXBLK,d4
  72.         sub.l   #MAXBLK,d5
  73.         bra     wnxblk
  74. wrtend  move.l  IO_LENGTH(a3),IO_ACTUAL(a3)
  75.         clr.b   IO_ERROR(a3)         ;IO_ERROR = 0
  76.         rts
  77. writeerr
  78.         clr.l   IO_ACTUAL(a3)
  79.         move.b  #$15,IO_ERROR(a3)    ;IO_ERROR = TDERR_SeekError
  80.         rts
  81.  
  82. Read
  83.         move.l  a1,a3
  84. rdagain
  85.         clr.l   IO_ACTUAL(a3)
  86.         move.l  IO_DATA(a3),a2
  87.         move.l  IO_OFFSET(a3),d4
  88.         move.l  IO_LENGTH(a3),d5
  89.         beq.s   rdend
  90. rnxblk  cmp.l   #MAXBLK,d5
  91.         bhi.s   rdbig
  92.         move.l  d4,d0
  93.         move.l  d5,d1
  94.         bsr     remap
  95.         bsr     readsec
  96.         bne.s   readerr
  97.         bra.s   rdend
  98. rdbig   move.l  #MAXBLK,d1
  99. rdb1    move.l  d4,d0
  100.         bsr     remap
  101.         bsr     readsec
  102.         bne.s   readerr
  103.         add.l   #MAXBLK,a2
  104.         add.l   #MAXBLK,d4
  105.         sub.l   #MAXBLK,d5
  106.         bra.s   rnxblk
  107. rdend   move.l  IO_LENGTH(a3),IO_ACTUAL(a3)
  108.         clr.b   IO_ERROR(a3)         ;IO_ERROR = 0
  109.         rts
  110.  
  111. readerr move.b  _inbuffer,d0
  112.         and.b   #$7f,d0
  113.         bne.s   rdrealerr       ; Got a real (non-sync) error
  114.  
  115. rdsync  bsr     doreset         ; Get in sync with controller
  116.         bsr     doerror
  117.         bne.s   rdsync
  118.         bra.s   rdagain
  119.  
  120. rdrealerr
  121.         cmp.b   #$18,d0
  122.         beq.s   rdend
  123.  
  124. rerrnd  clr.l   IO_ACTUAL(a3)
  125.         move.b  #$16,IO_ERROR(a3)    ;IO_ERROR = TDERR_SeekError
  126.         rts
  127.  
  128. ioport  EQU     $e80001         ; io specific code
  129. status  EQU     $e80003         ; d0-d1/a0-a1 is scratch
  130. select  EQU     $e80005
  131. flags   EQU     $e80007
  132.  
  133. complete
  134.         DMPCHR  10,#'C'         ; Do completion phase
  135.         move.l  #0,d1
  136. cm05    move.b  status,d0
  137.         and.b   #%00100000,d0   ; Check 4 IRQ flag
  138.         bne.s   cm2
  139.         subq.l  #1,d1
  140.         bne.s   cm05
  141.         bra.s   cm4
  142.  
  143. cm2     move.b  ioport,d1
  144.         DMPCHR  10,#'R'
  145.         DMPHEX  10,d1
  146.         DMPNL   10
  147.         btst    #1,d1
  148.         bne.s   cm3
  149.         moveq   #0,d0
  150.         rts
  151. cm3     and.b   #$20,d1         ; We got a real (non-sync) error
  152.         move.b  d1,d3
  153.         bsr     doerror
  154.         beq.s   cm1
  155. cm4     bsr     doreset         ; If serious - reset
  156. cm1     moveq   #1,d0
  157.         rts
  158.  
  159. hardreq
  160.         DMPCHR  20,#'q'         ; Waits 4 REQ & BUSY -
  161.         moveq   #0,d1           ; Worx only in command mode
  162. hr2     move.b  status,d0
  163.         btst    #0,d0           ; Test REQ
  164.         bne.s   hr3
  165.         btst    #3,d0           ; Test BUSY
  166.         beq.s   hr1
  167.         subq.l  #1,d1
  168.         bne.s   hr2
  169.         bra.s   hr1             ; Timeout!
  170.  
  171. hr3     DMPCHR  20,#'Q'
  172.         moveq   #0,d0
  173.         rts
  174. hr1     moveq   #1,d0
  175.         rts
  176.  
  177. hardex                          ; a0 = ptr 2 cmd 2 send
  178.         DMPHEX  10,(a0)         ; a1 = ioport on exit
  179.         DMPHEX  10,4(a0)
  180.  
  181.         move.w  #-1,d1
  182. hdx01   move.b  status,d0
  183.         and.b   #%1001,d0
  184.         beq.s   hdx02
  185.         dbra    d1,hdx01
  186.         bra.s   hdx2
  187.  
  188. hdx02
  189.         move.b  d0,select       ; Start command mode
  190.         move.b  #$02,flags      ; Enable IRQ
  191.  
  192.         move.w  #-1,d1
  193. hdx05   move.b  status,d0
  194.         and.b   #$0d,d0
  195.         cmp.b   #$0d,d0
  196.         beq.s   hdx1
  197.         dbra    d1,hdx05
  198.         bra.s   hdx2
  199.  
  200. hdx1    DMPCHR  10,#'S'
  201.         lea     ioport,a1
  202.         move.b  (a0)+,(a1)
  203.         move.b  (a0)+,(a1)
  204.         move.b  (a0)+,(a1)
  205.         move.b  (a0)+,(a1)
  206.         move.b  (a0)+,(a1)
  207.         move.b  (a0)+,(a1)
  208.  
  209.         moveq   #0,d0
  210.         rts
  211. hdx2    bsr     doreset         ; Errors here is serious
  212.         moveq   #1,d0
  213.         rts
  214.  
  215. sendbulk                        ; adress in a0, count-1 in d1
  216.         move.l  d2,-(sp)
  217.         move.w  d1,d2
  218.         lea     ioport,a1
  219. sbk3    bsr     hardreq
  220.         bne.s   sbk2
  221.         move.b  (a0)+,(a1)
  222.         dbra    d2,sbk3
  223.  
  224.         move.l  (sp)+,d2
  225.         moveq   #0,d0
  226.         rts
  227. sbk2    move.l  (sp)+,d2
  228.         moveq   #1,d0
  229.         rts
  230.  
  231. ;drive commands begin here
  232.  
  233. doreset
  234.         PUTMSG  90,<'doreset'>
  235.         move.b  #0,_inbuffer    ; So that we can tell apart from real error
  236.         move.b  d0,status
  237.         moveq   #0,d0
  238. dres1   nop
  239.         dbra    d0,dres1
  240.         DMPCHR  10,#'-'
  241.         DMPNL   10
  242.         moveq   #0,d0
  243.         rts
  244.  
  245. doinit
  246.         PUTMSG  90,<'doinit'>
  247.         lea     initcmd,a0      ;initialize drive parameters
  248.         DMPHEX  90,(a0)
  249.         DMPHEX  90,4(a0)
  250.         DMPHEX  90,8(a0)
  251.         DMPHEX  90,12(a0)
  252.         DMPNL   90
  253.         bsr     unpacsec
  254.         bsr     hardex
  255.         bne.s   di1
  256.         lea     initcmd+6,a0    ; a0 = ptr 2 drive parms
  257.         moveq   #8-1,d1
  258.         bsr     sendbulk
  259.         bne.s   di1
  260.         bsr     complete
  261.         bne.s   di1
  262.         moveq   #0,d0
  263.         rts
  264. di1     moveq   #1,d0
  265.         rts
  266.  
  267. dofmtone                        ; Format track as described in fmtcmd
  268.         lea     fmtcmd,a0
  269.         bsr     hardex
  270.         bne.s   dfo1
  271.         bsr     complete
  272.         bne.s   dfo1
  273.         moveq   #0,d0
  274.         rts
  275. dfo1    moveq   #1,d0
  276.         rts
  277.  
  278. doseek                          ; Seek to sector in d0
  279.         lea     seekcmd,a0
  280.         bsr     unpacsec
  281.         bsr     hardex
  282.         bne.s   ds1
  283.         bsr     hardreq
  284.         bne.s   ds1
  285.         bsr     complete
  286.         bne.s   ds1
  287.         moveq   #0,d0
  288.         rts
  289. ds1     moveq   #1,d0
  290.         rts
  291.  
  292. readsec                         ; d0 = sector, d1 = length, a2 = data
  293.         movem.l d2/a2,-(sp)
  294.         asr.l   #8,d1
  295.         asr.l   #1,d1
  296.         move.l  d1,d2
  297.         move.b  d1,readcmd+4
  298.         lea     readcmd,a0
  299.         bsr     unpacsec
  300.  
  301.         bsr     hardex
  302.         bne.s   dr1
  303.         subq    #1,d2
  304. dgm2
  305.         bsr     hardreq
  306.         bne.s   dr1
  307.         btst    #5,status       ; Got an interrupt - maybe error $11
  308.         bne.s   rdxt
  309.         move.l  #32-1,d1
  310. dmget   move.b  (a1),(a2)+
  311.         move.b  (a1),(a2)+
  312.         move.b  (a1),(a2)+
  313.         move.b  (a1),(a2)+
  314.         move.b  (a1),(a2)+
  315.         move.b  (a1),(a2)+
  316.         move.b  (a1),(a2)+
  317.         move.b  (a1),(a2)+
  318.         move.b  (a1),(a2)+
  319.         move.b  (a1),(a2)+
  320.         move.b  (a1),(a2)+
  321.         move.b  (a1),(a2)+
  322.         move.b  (a1),(a2)+
  323.         move.b  (a1),(a2)+
  324.         move.b  (a1),(a2)+
  325.         move.b  (a1),(a2)+
  326.         dbra    d1,dmget
  327.         dbra    d2,dgm2
  328.  
  329. rdxt    bsr     complete
  330.         bne.s   dr1
  331.         movem.l (sp)+,d2/a2
  332.         moveq   #0,d0
  333.         rts
  334. dr1     movem.l (sp)+,d2/a2
  335.         moveq   #1,d0
  336.         rts
  337.  
  338. writesec
  339.         movem.l d2/a2,-(sp)
  340.         asr.l   #8,d1           ; Offset -> logical sector
  341.         asr.l   #1,d1
  342.         move.l  d1,d2
  343.         move.b  d1,wrtcmd+4
  344.         lea     wrtcmd,a0
  345.         bsr     unpacsec
  346.  
  347.         bsr     hardex
  348.         bne.s   dw1
  349.         subq    #1,d2
  350. wtmp
  351.         bsr     hardreq
  352.         bne.s   dw1
  353.         btst    #5,status       ; Got an interrupt - maybe error $11
  354.         bne.s   wsxt
  355.         move.l  #32-1,d1
  356. wbk3    move.b  (a2)+,(a1)
  357.         move.b  (a2)+,(a1)
  358.         move.b  (a2)+,(a1)
  359.         move.b  (a2)+,(a1)
  360.         move.b  (a2)+,(a1)
  361.         move.b  (a2)+,(a1)
  362.         move.b  (a2)+,(a1)
  363.         move.b  (a2)+,(a1)
  364.         move.b  (a2)+,(a1)
  365.         move.b  (a2)+,(a1)
  366.         move.b  (a2)+,(a1)
  367.         move.b  (a2)+,(a1)
  368.         move.b  (a2)+,(a1)
  369.         move.b  (a2)+,(a1)
  370.         move.b  (a2)+,(a1)
  371.         move.b  (a2)+,(a1)
  372.         dbra    d1,wbk3
  373.         dbra    d2,wtmp
  374.  
  375. wsxt    bsr     complete
  376.         bne.s   dw1
  377.         movem.l (sp)+,d2/a2
  378.         moveq   #0,d0
  379.         rts
  380. dw1     movem.l (sp)+,d2/a2
  381.         moveq   #1,d0
  382.         rts
  383.  
  384. doerror
  385.         PUTMSG  90,<'Error: '>
  386.         lea     getsense,a0
  387.         bsr     unpacsec
  388.         bsr     hardex
  389.         bne.s   de1
  390.  
  391.         bsr     hardreq
  392.         bne.s   de1
  393.  
  394.         lea     ioport,a1
  395.         lea     _inbuffer,a0
  396.         move.b  (a1),(a0)+
  397.         move.b  (a1),(a0)+
  398.         move.b  (a1),(a0)+
  399.         move.b  (a1),(a0)+
  400.  
  401.         bsr     complete
  402.         bne.s   de1
  403.         DMPHEX  1,_inbuffer
  404.         DMPNL   1
  405.         moveq   #0,d0
  406.         rts
  407. de1     moveq   #1,d0
  408.         rts
  409.  
  410. dofmttrk
  411.         movem.l d2/d6,-(sp)
  412.         lea     fmtcmd,a0
  413.         bsr     unpacsec
  414.         clr.w   d6
  415. dft1    move.l  #0,d0
  416.         bsr     doseek
  417.         bne.s   dft2
  418.         bsr     dofmtone
  419.         bne.s   dft2
  420.         addq    #1,d6
  421.         move.b  d6,fmtcmd+1
  422.         or.b    d3,fmtcmd+1
  423.         cmp.w   heads,d6
  424.         bne.s   dft1
  425.         movem.l (sp)+,d2/d6
  426.         moveq   #0,d0
  427.         rts
  428. dft2    movem.l (sp)+,d2/d6
  429.         moveq   #1,d0
  430.         rts
  431.  
  432. unpacsec                        ; a0 ptr 2 cmd 2 patch
  433.         movem.l d2,-(sp)
  434.         moveq   #9,d1
  435.         asr.l   d1,d0           ;Patches offset in d0
  436.         move.w  sectors,d1
  437.         beq.s   ups1
  438.         bsr     _CXD33
  439.         move.w  d1,d2           ; rest = sector# in d2
  440.         divu    heads,d0
  441.         swap    d0
  442.         move.b  d0,d1
  443.         clr.w   d0
  444.         swap    d0
  445.         or.b    d3,d1
  446.  
  447.         move.b  d0,3(a0)     ;cylinder in d0
  448.         and.b   #$3f,d2         ;head & unit in d1
  449.         ror.w   #2,d0           ;sector in d2
  450.         and.b   #$c0,d0
  451.         or.b    d2,d0
  452.         move.b  d0,2(a0)
  453.         move.b  d1,1(a0)
  454.  
  455. ups1
  456.         movem.l (sp)+,d2
  457.         rts
  458.  
  459. remap
  460.         rts
  461.  
  462. hdconfig                        ; buffer to read from in a0
  463.         PUTMSG  90,<'hdconfig'>
  464.         lea     initcmd,a1
  465.         move.w  (a0),d0         ; fix # of cylinders
  466.         move.b  d0,6(a1)        ; lowbyte first
  467.         ror.w   #8,d0
  468.         move.b  d0,7(a1)        ; hibyte last
  469.         move.w  (a0),d0
  470.         subq    #1,d0           ; maxcyl - 1 = last writeable cylinder
  471.         move.b  d0,9(a1)        ; lowbyte first
  472.         ror.w   #8,d0
  473.         move.b  d0,10(a1)       ; hibyte last
  474.  
  475.         move.w  2(a0),d0        ; fix precomp at ...
  476.         move.b  d0,11(a1)       ; lowbyte first
  477.         ror.w   #8,d0
  478.         move.b  d0,12(a1)       ; hibyte last
  479.  
  480.         move.b  13(a0),13(a1)   ; set ECC burst length
  481.  
  482.         move.w  6(a0),heads     ; save # of heads...
  483.         move.b  7(a0),8(a1)     ; ...in initcmd too
  484.  
  485.         move.w  4(a0),sectors   ; save # of sectors per track
  486.  
  487.         lea     fmtcmd,a1
  488.         move.b  9(a0),4(a1)     ; save interleave
  489.  
  490.         move.b  11(a0),d0       ; fix steprate
  491.         move.b  d0,seekcmd+5
  492.         move.b  d0,calcmd+5
  493.         move.b  d0,readcmd+5
  494.         move.b  d0,wrtcmd+5
  495.         move.b  d0,fmtcmd+5
  496.         clr.l   d0
  497.         rts
  498.  
  499.         section "hdifdata",data
  500.  
  501. initcmd dc.b    $0c,$00,$00,$00,$00,$00         ;io specific data
  502.         dc.b    $67,$02,$04,$66,$02,$2c,$01,$0b
  503. fmtcmd  dc.b    $06,$00,$00,$00,$02,$03
  504. seekcmd dc.b    $0b,$00,$00,$00,$00,$03
  505. calcmd  dc.b    $01,$00,$00,$00,$00,$03
  506. getsense dc.b   $03,$00,$00,$00,$00,$00
  507. readcmd dc.b    $08,$00,$00,$00,$01,$03
  508. wrtcmd  dc.b    $0a,$00,$00,$00,$01,$03
  509. tdrcmd  dc.b    $00,$00,$00,$00,$00,$00
  510.  
  511. sectors         dc.w    17      ; Default disktype
  512. heads           dc.w    4
  513.  
  514.         section "hdifbss",bss
  515.  
  516.         cnop    0,4
  517.  
  518. _inbuffer       ds.b    512
  519. endbuf
  520.  
  521.         end
  522.  
  523.